package cn.yx.common.core.util;

import cn.hutool.core.convert.Convert;
import cn.yx.common.core.constant.message.PropertiesUtilMessageKey;
import cn.yx.common.core.exception.CommonException;
import cn.yx.common.core.util.io.FileUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.math.BigDecimal;
import java.util.Properties;

/**
 * <p>Properties配置工具类，由此类读取指定路径的配置文件</p>
 *
 * @author Wgssmart
 */
@Slf4j
public final class PropertiesUtil {

    private PropertiesUtil() {
    }

    /**
     * 根据指定的配置文件路径读取文件内容到Properties实例中
     *
     * @param location 配置文件的路径，包含两种形式，classpath:/和/WEB-INF的两个位置
     * @return Properties对象
     * @see FileUtil
     */
    public static Properties read(String location) {
        String propertyFilePath = FileUtil.getResourcePath(location);
        try (BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(
                        new BufferedInputStream(
                                new FileInputStream(propertyFilePath))))) {
            Properties properties = new Properties();
            properties.load(bufferedReader);
            return properties;
        } catch (IOException e) {
            log.error("read properties file error: {}, file location: {}", e.getMessage(), location);
            throw new CommonException(PropertiesUtilMessageKey.READ_PROPERTIES_ERROR, e);
        }
    }

    /**
     * 通过指定的key值去获取properties文件中整数值
     *
     * @param properties Properties对象
     * @param key        properties文件中的key
     * @return 返回key值对应的整数值，当且仅当此值是一个整数类型值时
     */
    public static Integer getInteger(Properties properties, String key) {
        String value = properties.getProperty(key);
        return Convert.toInt(value);
    }

    /**
     * 通过指定的key值去获取properties文件中字符串值
     *
     * @param properties Properties对象
     * @param key        properties文件中的key
     * @return 返回key值对应的字符串值
     */
    public static String getString(Properties properties, String key) {
        return properties.getProperty(key);
    }

    /**
     * 通过指定的key值去获取properties文件中double值
     *
     * @param properties Properties对象
     * @param key        properties文件中的key
     * @return 返回key值对应的double值，当且仅当此值是一个数值类型值时
     */
    public static Double getDouble(Properties properties, String key) {
        String value = properties.getProperty(key);
        return Convert.toDouble(value);
    }

    /**
     * 通过指定的key值去获取properties文件中float值
     *
     * @param properties Properties对象
     * @param key        properties文件中的key
     * @return 返回key值对应的float值，当且仅当此值是一个数值类型值时
     */
    public static Float getFloat(Properties properties, String key) {
        String value = properties.getProperty(key);
        return Convert.toFloat(value);
    }

    /**
     * 通过指定的key值去获取properties文件中长整型值
     *
     * @param properties Properties对象
     * @param key        properties文件中的key
     * @return 返回key值对应的长整型值，当且仅当此值是一个长整数类型值时
     */
    public static Long getLong(Properties properties, String key) {
        String value = properties.getProperty(key);
        return Convert.toLong(value);
    }

    /**
     * 通过指定的key值去获取properties文件中布尔类型值
     *
     * @param properties Properties对象
     * @param key        properties文件中的key
     * @return 返回key值对应的布尔类型值，当且仅当此值是一个布尔类型值时
     */
    public static Boolean getBoolean(Properties properties, String key) {
        String value = properties.getProperty(key);
        return Convert.toBool(value);
    }

    /**
     * 通过指定的key值去获取properties文件中BigDecimal类型值
     *
     * @param properties Properties对象
     * @param key        properties文件中的key
     * @return 返回key值对应的BigDecimal值
     */
    public static BigDecimal getBigDecimal(Properties properties, String key) {
        String value = properties.getProperty(key);
        return Convert.toBigDecimal(value);
    }

}
